package com.liu.annotation_01;


import java.lang.annotation.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * 注解：给程序看的
 */
public class diyAnnotetion {
    /**
     * @Override重写
     * @Deprecated 代表弃用
     * @SuppressWarnings()  警告
     */
    //元注解：高级注解，解释注解的注解
    /**
     * @Target()  表示注解的使用范围 类 接口 字段 方法 参数 常量 变量 局部变量 注解类型 包装
     * @Documented 标注生成文档
     * @Retention  表示生命周期  SOURCE(源代码时有用) < CLASS(编译之后存在，运行时不保留)  <  RUNTIME(运行时依旧保留)
     *@Inherited    注释类型自动继承
     */

    @myAnnotetion(value = "张三")
    public static void myMethod() throws ClassNotFoundException {

    }

    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {

        try {
            //step 1 通过反射获取类
            Class s1 = Class.forName("com.liu.annotation_01.diyAnnotetion");//diyAnnotetion.class
            //step 2 现在使用反射获得方法
            Method methods = s1.getMethod("myMethod",null);
            //step 3 我的自定义注解为@mtAnnotetion,定义在方法上的注解 如果是定义在类上的，可以修改step 2
            myAnnotetion annotation = methods.getAnnotation(myAnnotetion.class);
            System.out.println(methods);
            //获取值
            System.out.println(annotation.value());
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }


    }
}

@SuppressWarnings("all")
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotetion{
        /* 参数 */
    String value() default "";
}

@SuppressWarnings("all")//使用后myObject下面不在有线
class myObject extends Object{

    @Override
    public String toString() {
        return super.toString();
    }
}